package com.cmc.cloud.cmclink.doc.service;

import com.cmc.cloud.cmclink.doc.entity.SpecialCargoDgConfDO;
import com.cmc.cloud.cmclink.doc.entity.SpecialCargoDgDO;
import com.cmc.cloud.cmclink.doc.entity.SpecialCargoSuspectedDgDO;
import com.cmc.cloud.cmclink.doc.vo.special.dgextconfigvo.DgConfigVO;
import com.cmc.cloud.cmclink.doc.vo.special.dgextconfigvo.SpecialCargoDgConfBaseVO;
import com.cmc.cloud.cmclink.doc.vo.special.dgextconfigvo.SpecialCargoDgConfPageReqVO;
import com.cmc.cloud.cmclink.doc.vo.special.dgextconfigvo.SpecialCargoDgConfRespVO;
import com.cmc.cloud.cmclink.doc.vo.specialcargodgvo.*;
import com.cmes.framework.common.pojo.PageResult;

import javax.validation.Valid;
import java.util.List;

/**
 * 特种货审批dg Service 接口
 *
 * @author 集运管理员
 */
public interface SpecialCargoDgService {

    /**
     * 创建特种货审批dg
     *
     * @param createReqVO 创建信息
     * @return 新创建的特种货审批dg记录ID，可用于后续查询、更新或关联其他信息
     */
    Long createSpecialCargoDg(@Valid DgCreateOrUpdateReqVO createReqVO);

    /**
     * 更新特种货审批dg
     *
     * @param updateReqVO 更新信息
     */
    void updateSpecialCargoDg(@Valid SpecialCargoDgUpdateReqVO updateReqVO);

    /**
     * 删除特种货审批dg
     *
     * @param id 编号
     */
    void deleteSpecialCargoDg(Long id);

    /**
     * 获得特种货审批dg
     *
     * @param id 编号
     * @return 特种货审批dg
     */
    SpecialCargoDgDO getSpecialCargoDg(Long id);

    /**
     * 获得特种货审批dg列表
     *
     * @param applyId 编号
     * @return 特种货审批dg列表
     */
    List<SpecialCargoDgDO> getSpecialCargoDgList(Long applyId);

    /**
     * 获得特种货审批dg分页
     *
     * @param pageReqVO 分页查询
     * @return 特种货审批dg分页
     */
    PageResult<SpecialCargoDgDO> getSpecialCargoDgPage(SpecialCargoDgPageReqVO pageReqVO);

    /**
     * 获得特种货隔离组
     * @return 返回隔离组
     */
    List<String> getSegregation();

    /**
     * 获取联合国编号UnNo
     * @return 返回联合国编号UnNo
     */
    List<DgUnNoSimpleRespVO> getUnNo();

    /**
     * 获取危险货物的分类体系和PSN
     * @param unNo 联合国编号
     * @return 返回危险货物的分类体系和PSN
     */
    DgUnNoRespVO getImoClassAndPsn(String unNo);

    /**
     * 根据unNo 查询是否需要填写相关扩展字段
     * @param unNo unNo
     * @return DgExtByUnNoRespVO
     */
    DgExtByUnNoVO checkIfDgExtByUnNo(String unNo);

    /**
     * 检查扩展字段值
     * @param extArg extArg
     */
    void checkDgExtValue(List<DgConfigVO> extArg);

    /**
     * 获得DG信息
     * @param pageReqVO 分页查询
     * @return 返回DG信息
     */
    PageResult<DgUnNoSimpleRespVO> getUnNoDgPage(UnNoDgPageReqVO pageReqVO);
    /**
     * 创建特种货DG关联配置
     *
     * @param createReqVO 创建信息
     */
    void createSpecialCargoDgConf(@Valid SpecialCargoDgConfBaseVO createReqVO);

    /**
     * 更新特种货DG关联配置
     *
     * @param updateReqVO 更新信息
     */
    void updateSpecialCargoDgConf(@Valid SpecialCargoDgConfBaseVO updateReqVO);

    /**
     * 删除特种货DG关联配置
     *
     * @param id 编号
     */
    void deleteSpecialCargoDgConf(Long id);

    /**
     * 获得特种货DG关联配置
     *
     * @param id 编号
     * @return 特种货DG关联配置
     */
    SpecialCargoDgConfDO getSpecialCargoDgConf(Long id);


    /**
     * 获得特种货DG关联配置分页
     *
     * @param pageReqVO 分页查询
     * @return 特种货DG关联配置分页
     */
    PageResult<SpecialCargoDgConfRespVO> getSpecialCargoDgConfPage(SpecialCargoDgConfPageReqVO pageReqVO);


    /**
     * 更新疑似危险品待处理清单
     *
     * @param updateReqVO 更新信息
     */
    void updateSpecialCargoSuspectedDg(@Valid SpecialCargoSuspectedDgBaseVO updateReqVO);

    /**
     * 删除疑似危险品待处理清单
     *
     * @param id 编号
     */
    void deleteSpecialCargoSuspectedDg(Long id);

    /**
     * 获得疑似危险品待处理清单
     *
     * @param id 编号
     * @return 疑似危险品待处理清单
     */
    SpecialCargoSuspectedDgDO getSpecialCargoSuspectedDg(Long id);


    /**
     * 获得疑似危险品待处理清单分页
     *
     * @param pageReqVO 分页查询
     * @return 疑似危险品待处理清单分页
     */
    PageResult<SpecialCargoSuspectedDgBaseVO> getSpecialCargoSuspectedDgPage(SpecialCargoSuspectedDgPageReqVO pageReqVO);

    void saveSuspectedDg(List<SuspectedDgReqVO> reqVo);

}
